package com.itcam.phaseiii.thread_;

/**
 * Author:Cammy.Wu
 * Date:2024-05-10
 * Description:
 */

/**
 * 线程安全与同步
 *      ⚪安全问题出现的条件
 *              多线程环境
 *              有共享数据
 *              有多条语句操作共享数据
 *
 *      ⚪同步技术：
 *          将多条语句操作共享数据的代码给锁起来，让任意时刻只能有一个线程可以执行
 *          三种方式：
 *              1.同步代码块
 *              2.同步方法
 *              3.Lock锁
 *
 *      注意事项：
 *          锁对象可以是任意对象，但是需要保证多线程的锁对象，是同一把锁
 *          同步可以解决多线程的数据安全问题，但是也会降低程序的运行效率
 */

public class ThreadTest01 {
    /*
        需求：某电影院目前正在上映国产大片，共有100张票，而它有3个窗口卖票，请设计一个程序模拟该电影票卖票
                -- 多条线程共享操作同一份资源
     */
    public static void main(String[] args) {
        // Runnable 扩展性更好

        TicketTask ticketTask = new TicketTask();

        Thread t1 = new Thread(ticketTask,"窗口1");
        Thread t2 = new Thread(ticketTask,"窗口2");
        Thread t3 = new Thread(ticketTask,"窗口3");

        t1.start();
        t2.start();
        t3.start();
    }

}

class TicketTask implements Runnable {

    /**
     * 同步代码块
     *  synchronized(锁对象){
     *      多条语句操作共享数据的代码
     *  }
     *  注意：锁对象可以是任意对象
     */

    private Object o=new Object();

    private int ticket = 100;

    @Override
    public void run() {
        while (true) {
            synchronized (o){
                if (ticket == 0) {
                    break;
                }
                System.out.println(Thread.currentThread().getName() + "卖出了第" + ticket + "张票");
                ticket--;
            }
        }
    }
}
